/******************************************************
* 文    件：iic.c
* 版    本：V2.0
* 环    境：IAR for Atmel 6.70.1
* 芯    片：ATmega系列单片机
* 时    间：2016年4月29日
* 参    考：ST公司STM32固件库及网上资源的总结
* 公    司：彪彪电子(www.aabiao.top)
* 作    者：付瑞彪(Tom Free)
*******************************************************/

#include "iic.h"
#include "chip.h"
#include "gpio.h"

/******************************************************
* 函 数 名：IIC_Init()
* 功    能：初始化IIC总线
* 传入参数：无
* 传出参数：无
* 使用举例：IIC_Init();
*******************************************************/
void IIC_Init()
{
    TWSR=0x01;    // 2 Wire Bus initialization
    TWBR=0x01;    // Generate Acknowledge Pulse:On
    TWAR=0x00;    // 2 Wire Bus Slave Address:0h
    TWCR=0x44;    // General Call Recognition:Off,Bit Rate: 250.000 kHz
	//GPIO_PinSet(SDA,HIGH);
	//GPIO_PinSet(SCL,HIGH);
}

/******************************************************
* 函 数 名：IIC_Start()
* 功    能：开始IIC总线数据传输
* 传入参数：无
* 传出参数：无
* 使用举例：IIC_Start();
*******************************************************/
void IIC_Start()
{
	TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
  	while (!(TWCR & (1<<TWINT))){};
}

/******************************************************
* 函 数 名：IIC_Stop()
* 功    能：结束IIC总线数据传输
* 传入参数：无
* 传出参数：无
* 使用举例：IIC_Stop();
*******************************************************/
void IIC_Stop()
{
  	TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
}

/******************************************************
* 函 数 名：IIC_WriteByte(uint8 data)
* 功    能：IIC总线写一个字节数据
* 传入参数：data 待写入数据
* 传出参数：应答信号
* 使用举例：ack=IIC_WriteByte(0x88);
*******************************************************/
uint8 IIC_WriteByte(uint8 data)
{
   	unsigned char ack=1;
    TWDR = data;
    TWCR = (1<<TWINT)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT))){};
    if((TWSR & 0xF8) != TW_MT_SLA_ACK)
        ack = 0;
    return ack;  
}

/******************************************************
* 函 数 名：IIC_ReadByte(uint8 ack)
* 功    能：IIC总线读一个字节数据
* 传入参数：ack 读取数据后待发送的应答信号
* 传出参数：读取的数据
* 使用举例：data=IIC_ReadByte(ACK);
*******************************************************/
uint8 IIC_ReadByte(uint8 ack)
{
	if (ack)
        TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWEA);    
    else
        TWCR = (1<<TWINT)|(1<<TWEN);
    while (!(TWCR & (1<<TWINT))){};    
    return(TWDR);  
}
